Security News
Research
Data Theft Repackaged: A Case Study in Malicious Wrapper Packages on npm
The Socket Research Team breaks down a malicious wrapper package that uses obfuscation to harvest credentials and exfiltrate sensitive data.
sortable-dnd
Advanced tools
JS library for drag-and-drop lists, supports sortable and draggable
A JS Library for Drag and Drop, supports Sortable and Draggable
Install
npm install sortable-dnd
HTML
<ul id="group">
<li class="item">
<i id="handle" class="handle">handle</i>
<p>1</p>
</li>
<li class="item">
<i id="handle" class="handle">handle</i>
<p>2</p>
</li>
<li class="item">
<i id="handle" class="handle">handle</i>
<p>3</p>
</li>
</ul>
JavaScript
import Sortable from 'sortable-dnd';
let sortable = new Sortable(document.getElementById('group'), {
// draggable: 'li', // use tagName
// draggable: '#item', // use id
draggable: '.item', // use class
// handle: 'I', // use tagName
// handle: '#handle', // use id
// handle: (e) => e.target.tagName === 'I' ? true : false, // use function
handle: '.handle', // use class
});
new Sortable(element, {
draggable: '', // Specifies which items inside the element should be draggable
handle: '', // Drag handle selector within list items
group: '', // see @Group
lockAxis: '', // Axis on which dragging will be locked
multiple: false, // Enable multiple drag
selectHandle: '', // Handle selector within list items which used to select element in `multiple: true`
easing: '', // Easing for animation
animation: 150, // Animation speed moving items when sorting
chosenClass: '', // Class name for the chosen item
selectedClass: '', // The class of the element when it is selected, it is usually used when multiple drag
placeholderClass: '', // Class name for the drop placeholder
ghostStyle: {}, // The style of the mask element when dragging
ghostClass: '', // The class of the mask element when dragging
sortable: true, // Whether the current list can be sorted by dragging.
disabled: false, // Disables the sortable if set to true
autoScroll: true, // Automatic scrolling when moving to the edge of the container
scrollThreshold: 55, // Threshold to trigger autoscroll
scrollSpeed: { x: 10, y: 10 }, // Vertical&Horizontal scrolling speed (px)
delay: 0, // Time in milliseconds to define when the sorting should start
delayOnTouchOnly: false, // Only delay if user is using touch
touchStartThreshold: 1, // How many *pixels* the point should move before cancelling a delayed drag event.
emptyInsertThreshold: -1, // Distance mouse must be from empty sortable to insert drag element into it.
fallbackOnBody: false, // Appends the ghost element into the document's body
store: null, // store data
direction: '', // Direction of Sortable, will be detected automatically if not given.
swapOnDrop: true, // When the value is false, the dragged element will return to the starting position of the drag
removeCloneOnDrop: true, // Whether to remove the cloneEl after the drag is complete.
customGhost: (nodes) => {
// Customize the ghost element in drag
// you must return an HTMLElement
},
// Element is chosen
onChoose: (event) => {
// see @SortableEvent
},
// Element is unchosen
onUnchoose: (event) => {
// see @SortableEvent
},
// Element dragging started
onDrag: (event) => {
// see @SortableEvent
},
// Move an item in the list or between lists
onMove: (event) => {
// see @SortableEvent
},
// Element dragging is completed
onDrop: (event) => {
// see @SortableEvent
},
// Element is dropped into the current list from another
onAdd: (event) => {
// see @SortableEvent
},
// Element is removed from the current list into another
onRemove: (event) => {
// see @SortableEvent
},
// Dragging element changes position in the current list
onChange: (event) => {
// see @SortableEvent
},
// Element is selected
onSelect: (event) => {
// see @SelectEvent
},
// Element is unselected
onDeselect: (event) => {
// see @SelectEvent
},
});
Group
// string
group: 'name',
// object
group: {
name: 'group', // group name
// whether elements can be added from other lists,
// or an array of group names from which elements can be taken.
put: true | false | ['group1', 'group2'],
// whether elements can be moved out of this list.
pull: true | false | 'clone',
// revert drag element to initial position after moving to a another list.
revertDrag: true | false,
}
SortableEvent
event.from; // previous list
event.to; // list of currently placed drag element
event.node; // dragged element
event.nodes; // dragged elements
event.clone; // cloned element, all dnd operations are based on cloned element and do not alter the source dom(node).
event.clones; // cloned elements, there is a value only in the `pull: clone` after moving to a another list.
event.target; // drop element
event.oldIndex; // old index within parent. `-1`: element added from another list to the current list
event.newIndex; // new index within parent. `-1`: element has been removed from the current list
event.event; // TouchEvent | MouseEvent
event.pullMode; // Pull mode if dragging into another sortable.
event.relative; // Position of the drop element relative to the drag element after swap is complete.
event.revertDrag; // revert draged element to initial position after moving to a another list in `pull: 'clone'` & `revertDrag: true`.
event.backToOrigin; // dragged element go back to the original list in `pull: 'clone'`.
SelectEvent
event.event; // TouchEvent | MouseEvent
event.index; // index within parent
event.node; // dragged element
event.from; // list container
let sortable = new Sortable(el);
// Manually clear all the state of the component, using this method the component will not be draggable
sortable.destroy();
// Get or set the option value, depending on whether the `value` is passed in
sortable.option(key, value?);
// Selects the provided multi-drag item
sortable.select(element);
// Deselects the provided multi-drag item
sortable.deselect(element);
// Get the selected elements in the list, the return value is available in the case of `multiple`
sortable.getSelectedElements();
import Sortable from 'sortable-dnd';
Sortable.create(el: HTMLElement, options: SortableOptions); // Create new instance
Sortable.get(el: HTMLElement); // Get the Sortable instance of an element
Sortable.dragged; // The element being dragged
Sortable.clone; // The clone element
Sortable.ghost; // The ghost element
Sortable.active; // Active Sortable instance
Utils
import Sortable from 'sortable-dnd';
const { on, off, css, index, closest, getRect, toggleClass } = Sortable.utils;
// attach an event handler function
on(el: HTMLElement, event: String, fn: Function);
// remove an event handler
off(el: HTMLElement, event: String, fn: Function);
// set one CSS properties
css(el: HTMLElement, prop: String, value: String);
// Returns the index of an element within its parent for a selected set of elements
index(el: HTMLElement, selector: String);
// For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.
closest(el: HTMLElement, selector: String, context: HTMLElement, includeContext: Boolean);
// Returns the "bounding client rect" of given element
getRect(element: HTMLElement, relativeToContainingBlock: boolean, container: HTMLElement);
// Add or remove one classes from each element
toggleClass(el: HTMLElement, name: String, state: Boolean);
FAQs
JS library for drag-and-drop lists, supports sortable and draggable
The npm package sortable-dnd receives a total of 4,027 weekly downloads. As such, sortable-dnd popularity was classified as popular.
We found that sortable-dnd demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 0 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Research
The Socket Research Team breaks down a malicious wrapper package that uses obfuscation to harvest credentials and exfiltrate sensitive data.
Research
Security News
Attackers used a malicious npm package typosquatting a popular ESLint plugin to steal sensitive data, execute commands, and exploit developer systems.
Security News
The Ultralytics' PyPI Package was compromised four times in one weekend through GitHub Actions cache poisoning and failure to rotate previously compromised API tokens.